x86/xstate: Fix array overrun on hardware with LWP
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 9 Feb 2017 09:20:45 +0000 (10:20 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 9 Feb 2017 09:20:45 +0000 (10:20 +0100)
commitb378b1f9fa4796b5048e8ac0c58cdbb6307a55c4
tree1a52a281d223abd01ee1ef94c9ad76146d4e3976
parentb29aed8b0355fe9f7d49faa9aef12b2f8f983c2c
x86/xstate: Fix array overrun on hardware with LWP

c/s da62246e4c "x86/xsaves: enable xsaves/xrstors/xsavec in xen" introduced
setup_xstate_features() to allocate and fill xstate_offsets[] and
xstate_sizes[].

However, fls() casts xfeature_mask to 32bits which truncates LWP out of the
calculation.  As a result, the arrays are allocated too short, and the cpuid
infrastructure reads off the end of them when calculating xstate_size for the
guest.

On one test system, this results in 0x3fec83c0 being returned as the maximum
size of an xsave area, which surprisingly appears not to bother Windows or
Linux too much.  I suspect they both use current size based on xcr0, which Xen
forwards from real hardware.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: fe0d67576e335c02becf1cea8e67005509fa90b6
master date: 2017-01-16 17:37:26 +0000
xen/arch/x86/xstate.c